package world.xuewei.service.impl;

import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import world.xuewei.component.utils.CryptoUtil;
import world.xuewei.dao.UserRoleDao;
import world.xuewei.model.entity.MerchantInfo;
import world.xuewei.model.entity.Role;
import world.xuewei.model.entity.UserBase;
import world.xuewei.dao.UserBaseDao;
import world.xuewei.model.entity.UserRole;
import world.xuewei.service.MerchantInfoService;
import world.xuewei.service.UserBaseService;
import org.springframework.stereotype.Service;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;

import javax.annotation.Resource;

/**
 * 用户基础表(UserBase)表服务实现类
 *
 * @author makejava
 * @since 2024-11-15 19:27:52
 */
@Slf4j
@Service("userBaseService")
@Transactional(rollbackFor = Exception.class)
public class UserBaseServiceImpl implements UserBaseService {
    @Resource
    private UserBaseDao userBaseDao;
    @Resource
    private UserRoleDao userRoleDao;

    @Resource
    private MerchantInfoService merchantInfoService;

    @Override
    public UserBase login(UserBase userBase) {
        try {
            log.info("用户登录请求: {}", userBase);
            // 1. 加密输入的密码
            String encryptedPassword = CryptoUtil.encrypt(userBase.getPassword());
            userBase.setPassword(encryptedPassword);

            //2.查询用户
            UserBase existUser = userBaseDao.login(userBase);

            if (existUser == null) {
                throw new RuntimeException("账号或密码错误");
            }

            //检查账号状态
            if (existUser.getStatus() != 1) {
                throw new RuntimeException("账号已被禁用");
            }

            // 3. 更新登录时间
            userBaseDao.updateLoginTime(existUser);

            // 4. 查询用户角色
            Role role = userBaseDao.getUserRole(existUser.getId());
            existUser.setRoles(role);

            // 5. 清除敏感信息
            existUser.setPassword(null);

            return existUser;
        } catch (Exception e) {
            log.error("用户登录失败: {}", e.getMessage());
            throw new RuntimeException("登录失败：" + e.getMessage());
        }
    }

    //注册
    @Override
    public boolean register(UserBase user) {
        try {
            // 1. 检查用户名是否存在
            UserBase existUser = userBaseDao.selectByUsername(user.getUsername());
            if (existUser != null) {
                throw new RuntimeException("用户名已存在");
            }

            // 2. 加密密码
            user.setPassword(CryptoUtil.encrypt(user.getPassword()));

            // 2. 插入用户
            userBaseDao.insert(user);

            // 3. 设置默认角色
            UserRole userRole = new UserRole();
            userRole.setUserId(user.getId());
            userRole.setRoleId(3L);  // 默认普通用户角色 1L 管理员 2L 商户
            userRoleDao.insert(userRole);
            return true;

        } catch (Exception e) {
            throw new RuntimeException("注册失败：" + e.getMessage());
        }
    }

    @Override
    public boolean registerMerchant(UserBase userBase) {
        try {
            // 1. 注册用户账号
            // 检查用户名是否存在
            UserBase existUser = userBaseDao.selectByUsername(userBase.getUsername());
            if (existUser != null) {
                throw new RuntimeException("用户名已存在");
            }

            // 加密密码
            userBase.setPassword(CryptoUtil.encrypt(userBase.getPassword()));
            // 2. 插入用户
            if (!userBaseDao.insert(userBase)) {
                throw new RuntimeException("用户账号创建失败");
            }

            // 2. 创建默认商户信息
            MerchantInfo merchantInfo = new MerchantInfo();
            merchantInfo.setUserId(userBase.getId());
            merchantInfo.setStatus(1);
            merchantInfo.setCompanyName(userBase.getUsername() + "的店铺");  // 默认店铺名

            MerchantInfo result = merchantInfoService.insert(merchantInfo);
            if (result == null) {
                throw new RuntimeException("商户信息创建失败");
            }

            // 3. 更新用户角色为商户(角色ID为2)
            UserRole userRole = new UserRole();
            userRole.setUserId(userBase.getId());
            userRole.setRoleId(2L);  // 商户角色ID为2
            userRoleDao.insert(userRole);

            return true;
        } catch (Exception e) {
            throw new RuntimeException("商户注册失败：" + e.getMessage());
        }
    }






    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public UserBase queryById(Long id) {
        return this.userBaseDao.queryById(id);
    }

    /**
     * 分页查询
     *
     * @param userBase    筛选条件
     * @param pageRequest 分页对象
     * @return 查询结果
     */
    @Override
    public Page<UserBase> queryByPage(UserBase userBase, PageRequest pageRequest) {
        long total = this.userBaseDao.count(userBase);
        return new PageImpl<>(this.userBaseDao.queryAllByLimit(userBase, pageRequest), pageRequest, total);
    }


    /**
     * 修改数据
     *
     * @param userBase 实例对象
     * @return 实例对象
     */
    @Override
    public UserBase update(UserBase userBase) {
        this.userBaseDao.update(userBase);
        return this.queryById(userBase.getId());
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Long id) {
        return this.userBaseDao.deleteById(id) > 0;
    }
    /**
     * 通过主键更新数据
     *
     * @param user 用户
     *@return 影响行数
     */
    @Override
    public int edit(UserBase user) {
        return userBaseDao.edit(user);

    }
}
